note: mecab + python¶
結局janomeだけでなくMeCabも試した
nstall_mecab_env.sh¶
# https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md
brew install mecab
brew install mecab-ipadic
git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git ~/mecab-ipadic-neologd
cd ~/mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n
./bin/install-mecab-ipadic-neologd -h
Usage: install-mecab-ipadic-NEologd [OPTIONS]
This script is the installer of mecab-ipadic-NEologd
Options:
-h, --help
-v, --version
-p, --prefix /PATH/TO/INSTALL/DIRECTORY
Set any directory path where you want to install
-y, --forceyes If you want to install regardless of the result of test
-u, --asuser If you want to install to the user directory as an user
-n, --newest If you want to update mecab-ipadic-NEologd
# 次回からは、 -y を追加して実行すればよさそう
cd -
pip install mecab-python3
parse_to_node.py¶
import MeCab
"""
- 毎回while書くのめんどうなのでforで使えるgeneratorを作った
- なぜかencodeできない値が発生するので方法をググった
- http://www.trifields.jp/how-to-use-mecab-in-ubuntu-14-04-and-python-3-1196
- neologdを試せるようにしておいた
"""
def parse_to_node(text, opt=None):
if opt is None:
opt = "-Ochasen"
mecab = MeCab.Tagger(opt)
# encode error対策
mecab.parse("")
node = mecab.parseToNode(text)
while node:
yield node
node = node.next
# https://www.python.org/dev/peps/pep-0479/
raise StopIteration()
# to_df
import pandas as pd
text = "すもももももももものうち"
# 利用できそうな属性を探した
attrs = [
# 'bnext', 'enext', 'prev', 'next', 'this',
'alpha', 'beta', 'char_type', 'cost', 'feature', 'id',
'isbest', 'lcAttr', 'length', 'lpath', 'posid',
'prob', 'rcAttr', 'rlength', 'rpath', 'stat', 'surface', 'wcost'
]
gen = ({a: getattr(n, a) for a in dir(n) if a in attrs} for n in parse_to_node(text))
nodes = pd.DataFrame(gen)
# to_table.py
import tabulate
"""
- 形態素の情報を使いやすくした
- カラムが多い + pd.optionで調整するのがめんどうだったのでtableにした
- df.to_html + stringIO -> pypandoc(github markdown) では変換時にhtml classが付加されるせいでうまくいかなかった
- tabulate(https://pypi.python.org/pypi/tabulate)をたまに見るのでやってみた + headers="keys"が便利
"""
features = nodes.feature.str.split(",", expand=True)
features.columns = "f0 f1 f2 f3 f4 f5 f6 f7 f8".split()
nodes = pd.concat([nodes.drop("feature", axis=1), features], axis=1)
print(tabulate.tabulate(nodes, headers="keys", tablefmt="pipe"))
nodes
| | alpha | beta | char_type | cost | id | isbest | lcAttr | length | lpath | posid | prob | rcAttr | rlength | rpath | stat | surface | wcost | f0 | f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | |—:|——–:|——-:|————:|——-:|—–:|———:|———:|———:|——–:|——–:|——-:|———:|———-:|——–:|——-:|:———-|——–:|:——–|:—–|:—–|:—–|:—–|:—–|:—–|:—–|:—–| | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | | 0 | 0 | 0 | 0 | | 2 | | 0 | BOS/EOS | * | * | * | * | * | * | * | * | | 1 | 0 | 0 | 6 | 7263 | 9 | 1 | 1285 | 9 | | 38 | 0 | 1285 | 9 | | 0 | すもも | 7546 | 名詞 | 一般 | * | * | * | * | すもも | スモモ | スモモ | | 2 | 0 | 0 | 6 | 7774 | 18 | 1 | 262 | 3 | | 16 | 0 | 262 | 3 | | 0 | も | 4669 | 助詞 | 係助詞 | * | * | * | * | も | モ | モ | | 3 | 0 | 0 | 6 | 15010 | 24 | 1 | 1285 | 6 | | 38 | 0 | 1285 | 6 | | 0 | もも | 7219 | 名詞 | 一般 | * | * | * | * | もも | モモ | モモ | | 4 | 0 | 0 | 6 | 15521 | 30 | 1 | 262 | 3 | | 16 | 0 | 262 | 3 | | 0 | も | 4669 | 助詞 | 係助詞 | * | * | * | * | も | モ | モ | | 5 | 0 | 0 | 6 | 22757 | 36 | 1 | 1285 | 6 | | 38 | 0 | 1285 | 6 | | 0 | もも | 7219 | 名詞 | 一般 | * | * | * | * | もも | モモ | モモ | | 6 | 0 | 0 | 6 | 23131 | 46 | 1 | 368 | 3 | | 24 | 0 | 368 | 3 | | 0 | の | 4816 | 助詞 | 連体化 | * | * | * | * | の | ノ | ノ | | 7 | 0 | 0 | 6 | 23729 | 58 | 1 | 1313 | 6 | | 66 | 0 | 1313 | 6 | | 0 | うち | 5796 | 名詞 | 非自立 | 副詞可能 | * | * | * | うち | ウチ | ウチ | | 8 | 0 | 0 | 0 | 21245 | 62 | 1 | 0 | 0 | | 0 | 0 | 0 | 0 | | 3 | | 0 | BOS/EOS | * | * | * | * | * | * | * | * |